<?php

require_once APPPATH . 'dao/TestDAO.php';
require_once APPPATH . 'dao/SocioDAO.php';

/**
 * Clase que Testea los campos de Consulta de Socios
 */
class ConsultaSociosTest extends MY_Controller {

    function __construct() {
        parent::__construct();
    }

    public function index() {

        $testDAO = new TestDAO();
        $i = 0;
        
        $apellido = '';
        $numeroDocumento = '';
        $test = $this->validacionDatosFormulario($apellido, $numeroDocumento);
        $expected_result = TRUE;
        $test_name = 'Prueba ' . ++$i . ' - Prueba Validacion Campos Vacios';
        $this->unit->run($test, $expected_result, $test_name);

        $apellido = 'abcdefghijklmnñopqrstuvwxyzabc';
        $numeroDocumento = '';
        $test = $this->validacionDatosFormulario($apellido, $numeroDocumento);
        $expected_result = TRUE;
        $test_name = 'Prueba ' . ++$i . '- Prueba Validacion Campo apellido con valor limite';
        $this->unit->run($test, $expected_result, $test_name);

        $apellido = 'abcdefghijklmnñopqrstuvwxyzabcd';
        $numeroDocumento = '';
        $test = $this->validacionDatosFormulario($apellido, $numeroDocumento);
        $expected_result = FALSE;
        $test_name = 'Prueba ' . ++$i . '- Prueba Validacion Campo apellido con valor limite superado';
        $this->unit->run($test, $expected_result, $test_name);

        $apellido = '';
        $numeroDocumento = '99999999';
        $test = $this->validacionDatosFormulario($apellido, $numeroDocumento);
        $expected_result = TRUE;
        $test_name = 'Prueba ' . ++$i . ' - Prueba Validacion Campo numeroDocumento con valor limite';
        $this->unit->run($test, $expected_result, $test_name);

        $apellido = '';
        $numeroDocumento = '345353';
        $test = $this->validacionDatosFormulario($apellido, $numeroDocumento);
        $expected_result = False;
        $test_name = 'Prueba ' . ++$i . ' - Prueba Número no Valido';
        $this->unit->run($test, $expected_result, $test_name);

        $apellido = '';
        $numeroDocumento = '-34226385';
        $test = $this->validacionDatosFormulario($apellido, $numeroDocumento);
        $expected_result = False;
        $test_name = 'Prueba ' . ++$i . ' - Prueba Número Documento no Valido';
        $this->unit->run($test, $expected_result, $test_name);

        $apellido = '$%algo';
        $numeroDocumento = '-';
        $test = $this->validacionDatosFormulario($apellido, $numeroDocumento);
        $expected_result = False;
        $test_name = 'Prueba ' . ++$i . ' - Prueba caracteres no validos en apellido';
        $this->unit->run($test, $expected_result, $test_name);

        //Generación Reporte de Ejecución de las Pruebas
        echo $this->unit->report();
    }
    
    /**
     * Valida que se satisfagan simultáneamente las reglas de filtrado establecidas para
     * el capo de apellido y para el campo número documento
     * 
     * @param type $apellido
     * @param type $numeroDocumento
     * @return type 
     */
    private function validacionDatosFormulario($apellido, $numeroDocumento) {
        return ($this->validarApellidoONombre($apellido, 30) &&
                $this->validarNumeroDocumento($numeroDocumento) );
    }
    
    /**
     * Valida que se satisfagan simultáneamente las reglas de establecidas para
     * que un apellido sea considerado como válido
     * 
     * @param type $str
     * @param type $val
     * @return type 
     */
    private function validarApellidoONombre($str, $val) {

        return( $str == '' || ($this->alphaApostropheSpace($str) &&
                $this->max_length($str, $val) && $this->xss_clean($str) && $this->cleanQuery($str)));
    }
    
    /**
     * La cadena recibida como parámetro debe contener sólo números
     * 
     * @param type $str
     * @return type 
     */
    private function fotmatoNumeroDeDocumento($str) {

        return (preg_match('/^\d{7,8}$/', $str)) ? TRUE : FALSE;
    }
    
    /**
     * La cadena recibida como parámetro debe ser un número mayor que 4000000
     * 
     * @param type $str
     * @return type 
     */
    private function menorNumeroDeDocumentoPosible($str) {
        return ($str >= '4000000' ) ? TRUE : FALSE;
    }
    
    /**
     * Valida que se satisfagan simultáneamente las reglas de establecidas para
     * que un número de documento sea considerado como válido
     * 
     * @param type $str
     * @return type 
     */
    private function validarNumeroDocumento($str) {

        return ($str == '' || ($this->fotmatoNumeroDeDocumento($str) && $this->menorNumeroDeDocumentoPosible($str)
                && $this->xss_clean($str) && $this->cleanQuery($str)));
    }

    /**
     * Longitud Máxima
     *
     * @access	public
     * @param	string
     * @param	value
     * @return	bool
     */
    private function max_length($str, $val) {
        if (preg_match("/[^0-9]/", $val)) {
            return FALSE;
        }

        if (function_exists('mb_strlen')) {
            return (mb_strlen($str) > $val) ? FALSE : TRUE;
        }

        return (strlen($str) > $val) ? FALSE : TRUE;
    }

    /**
     * Función de seguridad para utilizar como regla de Form Validation en CI.
     * Escapa los caracteres especiales (PostgreSQL, para MySQL ver
     * mysql_real_escape_string) y determina si el campo contiene palabras no
     * permitidas, en cuyo caso devuelve FALSE en la validación.
     *
     * @param <type> $str
     * @return <type>
     */
    private function cleanQuery($str) {

        //Si los caracteres especiales son automáticamente escapados, los "des-escapa".
        if (get_magic_quotes_gpc()) {
            $str = stripslashes($str);
        }

        //Establece una conexión con la base de datos para obtener la versión de
        //PostgreSQL.

        $db_conn = pg_connect("host=localhost port=5432 dbname=MetodosDB user=postgres password=agu123");
        $pg_version = pg_version($db_conn);

        //Si la versión de PHP es mayor o igual a la 4.2.0 y la de PostgreSQL mayor
        //o igual a la 7.2 entonces se puede utilizar pg_escape_string, sino se utiliza
        //addslashes.
        if (phpversion() >= '4.2.0' && $pg_version['client'] >= '7.2') {
            $str = pg_escape_string($str);
        } else {
            $str = addslashes($str);
        }

        //Elimina tags HTML.
        $str = strip_tags($str);

        //Arreglo de palabras no permitidas.
        $invalidKeywords = array('select', 'from', 'where', 'union', 'insert',
            'update', 'join', 'create', 'delete');

        //Por cada palabra del arreglo, determina si aparece en la cadena. En ese caso,
        //retorna FALSE.
        for ($i = 0; $i < count($invalidKeywords); $i++) {
            $injection = stripos($str, $invalidKeywords[$i]);
            if (is_numeric($injection))
                return FALSE;
        }

        //Sino, retorna TRUE.
        return TRUE;
    }

    private function alphaApostropheSpace($str) {

        return (!preg_match('/^[a-zA-ZñÑáéíóúÁÉÍÓÚäëïöüÄËÏÖÜ\' ]*$/', $str)) ? FALSE : TRUE;
    }

    public function requerido($str) {

        return (trim($str) == 0) ? FALSE : TRUE;
    }

    /**
     * XSS Clean
     *
     * @access	public
     * @param	string
     * @return	string
     */
    private function xss_clean($str) {
        $CI = & get_instance();
        return $CI->security->xss_clean($str);
    }

}

?>